/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.galaxy.commom.base.utils;

import com.google.common.primitives.Doubles;
import com.google.common.primitives.Ints;
import com.google.common.primitives.Longs;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Collections工具集.基于Guava
 *
 * @author caijinbang
 */
@SuppressWarnings("rawtypes")
public class Collections3 {

  /**
   * 判断是否为空
   * @param collection 集合
   * @return 是否为空
   */
  public static boolean isEmpty(Collection collection) {
    return (collection == null) || collection.isEmpty();
  }

  /**
   * 判断Map是否为空
   * @param map map对象
   * @return 是否为空
   */
  public static boolean isEmpty(Map map) {
    return (map == null) || map.isEmpty();
  }

  /**
   * 判断是否不为空
   * @param collection 集合
   * @return 是否不为空
   */
  public static boolean isNotEmpty(Collection collection) {
    return (collection != null) && !(collection.isEmpty());
  }

  /**
   * 判断是否不为空
   * @param map map对象
   * @return 判断是否不为空
   */
  public static boolean isNotEmpty(Map map) {
    return (map != null) && !(map.isEmpty());
  }

  /**
   * 取得Collection的第一个元素，如果collection为空返回null.
   * @param collection 集合
   * @param <T> 对象
   * @return
   */
  public static <T> T getFirst(Collection<T> collection) {
    if (isEmpty(collection)) {
      return null;
    }
    return collection.iterator().next();
  }

  /**
   * 获取Collection的最后一个元素，如果collection为空返回null.
   * @param collection 集合
   * @param <T>  对象
   * @return 最后一个元素
   */
  public static <T> T getLast(Collection<T> collection) {
    if (isEmpty(collection)) {
      return null;
    }
    // 当类型List时，直接取得最后一个元素.
    if (collection instanceof List) {
      List<T> list = (List<T>) collection;
      return list.get(list.size() - 1);
    }

    // 其他类型通过iterator滚动到最后一个元素.
    Iterator<T> iterator = collection.iterator();
    while (true) {
      T current = iterator.next();
      if (!iterator.hasNext()) {
        return current;
      }
    }
  }

  /**
   * 返回a+b的新List.
   * @param a 第一个集合
   * @param b 第二个集合
   * @param <T> 对象
   * @return 并集
   */
  public static <T> List<T> union(final Collection<T> a, final Collection<T> b) {
    List<T> result = new ArrayList<T>(a);
    result.addAll(b);
    return result;
  }

  /**
   * 返回a-b的新List.
   * @param a 第一个集合
   * @param b 第二个集合
   * @param <T> 对象
   * @return 移除第二个对象在第一个集合中出现的对象
   */
  public static <T> List<T> subtract(final Collection<T> a, final Collection<T> b) {
    List<T> list = new ArrayList<T>(a);
    for (T element : b) {
      list.remove(element);
    }

    return list;
  }

  /**
   * 返回a与b的交集的新List.
   * @param a 第一个集合
   * @param b 第二个集合
   * @param <T> 对象
   * @return 交集
   */
  public static <T> List<T> intersection(Collection<T> a, Collection<T> b) {
    List<T> list = new ArrayList<T>();
    for (T element : a) {
      if (b.contains(element)) {
        list.add(element);
      }
    }
    return list;
  }

  /**
   * 返回一个底层由原始类型long保存的List, 与保存Long相比节约空间.
   */
  public static List<Long> asList(long... backingArray) {
    return Longs.asList(backingArray);
  }

  /**
   * 返回一个底层由原始类型int保存的List, 与保存Integer相比节约空间.
   */
  public static List<Integer> asList(int... backingArray) {
    return Ints.asList(backingArray);
  }

  /**
   * 返回一个底层由原始类型double保存的Double, 与保存Double相比节约空间.
   */
  public static List<Double> asList(double... backingArray) {
    return Doubles.asList(backingArray);
  }

}
